Android Studio调试AOSP源码的技巧

Android Studio调试AOSP源码的技巧

在工作中发现对于纯App开发的同学来说,frameworks的代码属于是一个禁区的存在,一旦进入到frameworks以后出现的各种问题,或者是流程跟踪,再或者是代码走读,大家都会一筹莫展。

大部分的工程师会采取访问androidxref的方式来跟代码,少部分有AOSP源码编译经验的工程师会通过增加日志的方式来进行调试,但是这两种做法的效率其实都不是太高,结合我自己的工作经验和认知,在这边分享一个调试frameworks操作指南,可以把system_server等其他进程当做是普通App进行调试,也可以把普通App运行到frameworks中的流程调试起来。

背景知识

  • Android Studio的调试是基于项目(Project)
  • Android Studio的断点是基于进程(Process)

因此,我们在进行前期准备的时候,需要人为构造一个项目,但是这个项目又不能是AOSP的源码,不然一次同步就会很久,有些电脑就直接挂掉了;后期调试的时候需要人为选择调试的进程,而不是通过Android Studio帮我们无脑attach。

构造项目

  1. 为了方便起见,可以在AOSP根目录的同级目录构造一个Android Studio的项目目录,我们起名为:QuickFWDebug

    2022-09-27_15-42-13

  2. 打开Android Studio,在界面中选择“Open an existing Android Studio Project”

    2022-09-27_15-44-52

  3. 选择我们刚才创建“QuickFWDebug”

    2022-09-27_15-48-50

  4. 这个时候整个Android Studio的界面就会打开了,但是所有的工程内容,包括attach的device栏,都是的,不要紧,我们后面一步一步来搞定这些问题。

    2022-09-27_15-51-30

  5. 我们先找到“File”标签

  6. 打开“File”标签下的“Project Structure”标签

    2022-09-27_15-55-56

  7. “Project Structure”界面下,选择Project

  8. 接着在右边的栏目中选择一个SDK版本,这个SDK会跟着Android Studio设置的SDK目录走,因为我们最终是要调试AOSP,所以无论选择哪一个其实都是可以的,我这边选择一个Android API 29 Platform(java version “1.8.0_212”),实际选择任何的SDK版本都是可以的,注意不要选择最上面1.8(java version “1.8.0_212”)

    2022-09-27_16-52-14

  9. 设置完了Project,我们就可以回到Android Studio的主界面了,这个时候不出意外的话,应该是可以看到手机已经连接了。

    2022-09-27_17-01-26

  10. 以上就完成了项目的创建,下面我们需要添加一下AOSP的源码,添加源码的方式有两种,一种是在Linux的设备上,这个就比较简单,可以使用soft link的方式来做:

    2022-09-27_17-05-09

    Windows端其实也是一样的思路,为什么这边要做软连接,实际是为了更好的替换AOSP的代码,当我们想要debug其他版本的AOSP工程时,只需要重新做soft link就可以了

  11. 当做完soft link之后,在Android Studio中应该会出现一个新的文件夹。如果没有的话,可以尝试关闭Android Studio,再重新选择QuickFWDebug的项目并打开,应该就可以看到。

    2022-09-27_17-08-09

  12. 这个时候直接双击打开aosp的文件夹,会导致电脑卡死,所以会有一个特别的技巧

    “Exclude File”,屏蔽掉所有的工程文件;再“Sources Root”,把想要debug的文件添加进来。

  13. 我们先右击项目的标签页,在弹出的选项中选择Mark Directory as

  14. 在二级菜单中,我们选择Excluded

    2022-09-27_17-21-05

  15. 比如我们需要调试ActivityManagerService.java,这个java文件的路径为:aosp/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

  16. 先找到ActivityManagerService.java最小的目录,也就是:aosp/frameworks/base/services/core/java/com/android/server/am/右击am目录,在弹出的选项中选择Mark Directory as

  17. 跟之前不同的是,这次我们需要debug该目录,所以我们要在二级菜单中,选择Sources Root

    2022-09-27_17-35-39

  18. 当设置当前的目录为Sources Root后,在Android Studio的界面中可以看到代码文件的样式就变了(跟正常的Android App开发的就很类似了)

    2022-09-27_17-43-16

经过以上的18个步骤,项目的构造步骤就做完了,下面就是进入到Debug的环节。

调试环节

调试的环节其实跟普通的Android App并没有什么区别,唯一需要注意的是要选择到正确的进程。

比如我们要对ActivityManagerService.java做调试,而众所周知,AMS是跑在system_server进程上的,因此需要先attach到system_server进程,但是由于Android Studio中的工程是一个空的假工程,所以在调试的页面中,需要勾选一下“Show all processes”

2022-09-27_17-54-14

  • 后续打断点的操作就是基本的Android Studio调试,这里就不再啰嗦了

一些小的注意点

  • 确保调试设备上的代码跟Android Studio中的代码是一致的,不然会跑不了
  • 确保attach到的进程是正确的,千万不要出现debug A进程但是attach B进程,这样的话设置的断点永远都不会停下来
  • Debugger中目前是Java Only的进程,所以纯native的一些进程暂时没有办法